#include <CUnit/CUnit.h>
#include <CUnit/Basic.h>
#include <stdio.h>
#include "wc.h"  // 包含基础功能函数声明

// -------------------------- 字符统计测试用例 --------------------------
// 用例1：空文件 → 字符数为0
void test_count_chars_empty() {
    CU_ASSERT_EQUAL(count_chars("test_empty.txt"), 0);
}

// 用例2：基础英文文本 → 统计所有字符（含字母、标点、空格）
// test_basic.txt 内容："Hello world! This is a test. How are you?"
void test_count_chars_basic() {
    CU_ASSERT_EQUAL(count_chars("test_basic.txt"), 42);
}

// 用例3：含特殊字符和数字 → 特殊字符/数字计入字符数
// test_special.txt 内容："Hello, world! 123 test... ---"
void test_count_chars_special() {
    CU_ASSERT_EQUAL(count_chars("test_special.txt"), 29);
}

// 用例4：中英文混合 → 中文每个字计1个字符（C语言中中文占多字节，但fgetc按字节读取，需根据编码调整预期值）
// 假设文件编码为 UTF-8（中文每个字占3字节）：
// test_chinese.txt 内容："你好！这是中文测试。Hello C!"
void test_count_chars_chinese() {
    CU_ASSERT_EQUAL(count_chars("test_chinese.txt"), 38);
}


// -------------------------- 单词统计测试用例 --------------------------
// 规则：仅字母组成的连续字符视为单词，非字母（空格、标点、数字）为分隔符
// 用例1：空文件 → 单词数为0
void test_count_words_empty() {
    CU_ASSERT_EQUAL(count_words("test_empty.txt"), 0);
}

// 用例2：基础英文文本 → 统计有效单词
// test_basic.txt 内容："Hello world! This is a test. How are you?"
void test_count_words_basic() {
    CU_ASSERT_EQUAL(count_words("test_basic.txt"), 9);
}

// 用例3：含特殊字符和数字 → 数字/特殊字符不视为单词
// test_special.txt 内容："Hello, world! 123 test... ---"
void test_count_words_special() {
    CU_ASSERT_EQUAL(count_words("test_special.txt"), 3);
}

// 用例4：中英文混合 → 仅英文单词计入（中文不视为字母）
// test_chinese.txt 内容："你好！这是中文测试。Hello C!"
void test_count_words_chinese() {
    CU_ASSERT_EQUAL(count_words("test_chinese.txt"), 2);
}


// -------------------------- 句子统计测试用例 --------------------------
// 规则：以 '.' '?' '!' 结尾视为一个句子
// 用例1：空文件 → 句子数为0
void test_count_sentences_empty() {
    CU_ASSERT_EQUAL(count_sentences("test_empty.txt"), 0);
}

// 用例2：基础英文文本 → 统计句子数
// test_basic.txt 内容："Hello world! This is a test. How are you?"
void test_count_sentences_basic() {
    CU_ASSERT_EQUAL(count_sentences("test_basic.txt"), 3);
}

// 用例3：多换行文本 → 换行不影响句子统计，仅看结尾标点
// test_multi_line.txt 内容："Line 1.<br>Line 2?<br>Line 3!"
void test_count_sentences_multi_line() {
    CU_ASSERT_EQUAL(count_sentences("test_multi_line.txt"), 3);
}

// 用例4：中文标点 → 中文感叹号/句号也计入（函数逻辑已支持，因直接判断字符）
// test_chinese.txt 内容："你好！这是中文测试。Hello C!"
void test_count_sentences_chinese() {
    CU_ASSERT_EQUAL(count_sentences("test_chinese.txt"), 3);
}


// -------------------------- 测试套件初始化与运行 --------------------------
// 初始化测试套件
int init_suite_basic() {
    // 可选：初始化测试文件（如自动创建空文件），避免手动创建
    FILE *f = fopen("test_empty.txt", "w");
    if (f) fclose(f);
    return 0;
}

// 清理测试套件
int clean_suite_basic() {
    // 删除测试文件
    remove("test_empty.txt");
    return 0;
}

int main() {
    // 1. 初始化 CUnit 注册表
    if (CU_initialize_registry() != CUE_SUCCESS) {
        return CU_get_error();
    }

    // 2. 创建测试套件（关联初始化/清理函数）
    CU_pSuite suite_basic = CU_add_suite(
        "Basic Functions Test Suite",  // 套件名
        init_suite_basic,              // 初始化函数
        clean_suite_basic              // 清理函数
    );
    if (!suite_basic) {
        CU_cleanup_registry();
        return CU_get_error();
    }

    // 3. 向套件添加所有测试用例
    // 字符统计用例
    if (!CU_add_test(suite_basic, "Test Empty File Chars", test_count_chars_empty) ||
        !CU_add_test(suite_basic, "Test Basic Text Chars", test_count_chars_basic) ||
        !CU_add_test(suite_basic, "Test Special Chars", test_count_chars_special) ||
        !CU_add_test(suite_basic, "Test Chinese Text Chars", test_count_chars_chinese) ||
        // 单词统计用例
        !CU_add_test(suite_basic, "Test Empty File Words", test_count_words_empty) ||
        !CU_add_test(suite_basic, "Test Basic Text Words", test_count_words_basic) ||
        !CU_add_test(suite_basic, "Test Special Words", test_count_words_special) ||
        !CU_add_test(suite_basic, "Test Chinese Text Words", test_count_words_chinese) ||
        // 句子统计用例
        !CU_add_test(suite_basic, "Test Empty File Sentences", test_count_sentences_empty) ||
        !CU_add_test(suite_basic, "Test Basic Text Sentences", test_count_sentences_basic) ||
        !CU_add_test(suite_basic, "Test Multi-line Sentences", test_count_sentences_multi_line) ||
        !CU_add_test(suite_basic, "Test Chinese Text Sentences", test_count_sentences_chinese)) {
        CU_cleanup_registry();
        return CU_get_error();
    }

    // 4. 运行测试（VERBOSE 模式：输出详细测试结果）
    CU_basic_set_mode(CU_BRM_VERBOSE);
    CU_basic_run_tests();

    // 5. 清理注册表并返回结果
    int ret = CU_get_number_of_failures();
    CU_cleanup_registry();
    return ret;
}